Spring JDBC এ PreparedStatement ব্যবহার

Java Technologies - স্প্রিং জেডিবিসি (Spring JDBC)
89
89

স্প্রিং জেডিবিসি (Spring JDBC) এ PreparedStatement ব্যবহারের মাধ্যমে SQL কোয়েরি রচনা ও রান করার প্রক্রিয়াটি আরও সুরক্ষিত এবং কার্যকরী হয়ে ওঠে। এটি SQL ইনজেকশন (SQL Injection) প্রতিরোধে সহায়ক এবং কোডকে আরও পাঠযোগ্য ও রক্ষণাবেক্ষণযোগ্য করে তোলে।

স্প্রিং জেডিবিসি তে PreparedStatement ব্যবহার

স্প্রিং জেডিবিসি সাধারণত JdbcTemplate এর মাধ্যমে PreparedStatement ব্যবহার করতে সক্ষম করে। JdbcTemplate এর update(), queryForObject(), query() এবং অন্যান্য মেথডগুলি স্বয়ংক্রিয়ভাবে PreparedStatement তৈরি করে এবং এগুলোর মাধ্যমে SQL এক্সিকিউট করা হয়।

উদাহরণ:

নিচে একটি উদাহরণ দেয়া হলো যা স্প্রিং জেডিবিসি তে PreparedStatement এর ব্যবহার দেখাবে।

১. ডেটাবেসে ডেটা ইনসার্ট করার জন্য PreparedStatement ব্যবহার

এখানে JdbcTemplate এর মাধ্যমে একটি INSERT স্টেটমেন্ট ব্যবহার করা হয়েছে।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class EmployeeDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // Method to insert employee details into the database
    public void addEmployee(int id, String name, double salary) {
        String sql = "INSERT INTO Employee (id, name, salary) VALUES (?, ?, ?)";

        // Use JdbcTemplate's update() method to execute the PreparedStatement
        jdbcTemplate.update(sql, id, name, salary);
    }
}

ব্যাখ্যা:

  • এখানে ? চিহ্নগুলো প্রিপেয়ারড স্টেটমেন্ট এর প্লেসহোল্ডার হিসেবে ব্যবহৃত হয়েছে।
  • jdbcTemplate.update(sql, id, name, salary); এই লাইনটি PreparedStatement তৈরি করে এবং SQL স্টেটমেন্ট এক্সিকিউট করে।

২. ডেটা রিটার্ন করতে PreparedStatement ব্যবহার

এখন একটি SELECT কোয়েরি ব্যবহারের উদাহরণ দেখানো হচ্ছে, যেখানে PreparedStatement ব্যবহার করে ডেটা রিটার্ন করা হচ্ছে।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class EmployeeDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // Method to fetch employee details by ID
    public Employee getEmployee(int id) {
        String sql = "SELECT * FROM Employee WHERE id = ?";

        // Use JdbcTemplate's queryForObject() method to execute the PreparedStatement
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(Employee.class));
    }
}

ব্যাখ্যা:

  • এখানে queryForObject মেথডটি PreparedStatement ব্যবহার করে SQL কোয়েরি রচনা করে এবং id এর ভিত্তিতে Employee অবজেক্ট ফিরিয়ে দেয়।
  • BeanPropertyRowMapper হল একটি স্প্রিং ক্লাস যা রেজাল্ট সেটের প্রতিটি সারি থেকে প্রপার্টি মেপ করে আপনার Employee ক্লাসে ম্যাপ করে।

৩. ডেটা আপডেট করতে PreparedStatement ব্যবহার

এখানে একটি UPDATE কোয়েরি উদাহরণ দেওয়া হচ্ছে:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class EmployeeDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // Method to update employee salary
    public void updateSalary(int id, double newSalary) {
        String sql = "UPDATE Employee SET salary = ? WHERE id = ?";

        // Use JdbcTemplate's update() method to execute the PreparedStatement
        jdbcTemplate.update(sql, newSalary, id);
    }
}

ব্যাখ্যা:

  • এই উদাহরণে update() মেথডের মাধ্যমে PreparedStatement ব্যবহার করা হয়েছে। এটি salary আপডেট করার জন্য id এবং newSalary ইনপুট হিসেবে নেয়।

৪. ডেটা মুছে ফেলতে PreparedStatement ব্যবহার

এখানে একটি DELETE কোয়েরি ব্যবহারের উদাহরণ:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class EmployeeDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // Method to delete employee by ID
    public void deleteEmployee(int id) {
        String sql = "DELETE FROM Employee WHERE id = ?";

        // Use JdbcTemplate's update() method to execute the PreparedStatement
        jdbcTemplate.update(sql, id);
    }
}

ব্যাখ্যা:

  • update() মেথডের মাধ্যমে DELETE SQL স্টেটমেন্ট তৈরি করে এবং id প্রেরণ করা হয়, যার মাধ্যমে নির্দিষ্ট Employee রেকর্ড মুছে ফেলা হয়।

PreparedStatement এর সুবিধা

  1. SQL ইনজেকশন প্রতিরোধ: PreparedStatement এর ব্যবহার SQL ইনজেকশন থেকে রক্ষা করে, কারণ এখানে ব্যবহারকারী ইনপুটগুলো যথাযথভাবে escape করা হয়।
  2. কার্যক্ষমতা: একাধিক PreparedStatement একই SQL কোডের জন্য পুনরায় ব্যবহার করা যায়, যার ফলে কর্মক্ষমতা উন্নত হয়।
  3. পাঠযোগ্যতা এবং রক্ষণাবেক্ষণ: কোডটি পরিষ্কার এবং সহজে রক্ষণাবেক্ষণযোগ্য হয়, কারণ প্লেসহোল্ডারগুলো স্পষ্টভাবে ইনপুট আর্গুমেন্টের সাথে সম্পর্কিত।

উপসংহার

স্প্রিং জেডিবিসি (Spring JDBC) এ PreparedStatement ব্যবহার করা বেশ সহজ এবং কার্যকরী। এটি ডেটাবেস অপারেশনের নিরাপত্তা এবং কর্মক্ষমতা বৃদ্ধির জন্য সহায়ক, বিশেষ করে যখন আপনি ব্যবহারকারীর ইনপুট দিয়ে SQL কোয়েরি তৈরি করেন। JdbcTemplate স্প্রিং এর মধ্যে একদম সহজভাবে PreparedStatement পরিচালনা করতে সাহায্য করে।

Content added By

PreparedStatement কি এবং কেন এটি প্রয়োজনীয়?

71
71

PreparedStatement হল Java Database Connectivity (JDBC) API-তে একটি ইন্টারফেস, যা SQL কুয়েরি বা স্টেটমেন্ট তৈরি এবং এক্সিকিউট করতে ব্যবহৃত হয়। এটি সাধারণ Statement এর তুলনায় আরও নিরাপদ, দ্রুত, এবং দক্ষ। Spring JDBC তে PreparedStatement ব্যবহৃত হয়, কারণ এটি ডেটাবেসের সাথে কার্যকরভাবে যোগাযোগ করতে সাহায্য করে এবং SQL ইনজেকশন থেকে রক্ষা করে।

PreparedStatement কি?

PreparedStatement হল একটি প্রিপেইরড (precompiled) SQL কুয়েরি, যা একবার তৈরি করা হলে পরে একাধিক বার ডেটাবেসে এক্সিকিউট করা যায়। এর মাধ্যমে SQL কুয়েরি চালানোর সময়, প্যারামিটারগুলির জন্য প্লেসহোল্ডার (যেমন ?) ব্যবহার করা হয় এবং পরে ডাইনামিকভাবে প্যারামিটার ভ্যালু ইনপুট করা যায়। এটি SQL কুয়েরি এক্সিকিউশনের গতিবিধি দ্রুত করে এবং একই কুয়েরি বারবার ডেটাবেসে ব্যবহার করার ক্ষেত্রে পারফরম্যান্স উন্নত করে।

PreparedStatement এর বৈশিষ্ট্য:

  1. SQL ইনজেকশন রক্ষা:
    SQL ইনজেকশন এক ধরনের নিরাপত্তা ঝুঁকি, যেখানে ইউজার ইনপুট দ্বারা খারাপ SQL কুয়েরি তৈরি হয়ে ডেটাবেসে অনিচ্ছাকৃত বা ক্ষতিকর অপারেশন চালাতে পারে। PreparedStatement এই ধরনের ঝুঁকি কমায় কারণ এটি ইউজার ইনপুটকে ডেটাবেস কুয়েরি হিসেবে প্যারামিটারাইজ করে এবং SQL কোড থেকে আলাদা রাখে। ফলে ইউজার ইনপুট কখনোই কোড হিসেবে এক্সিকিউট হয় না।
  2. ক্লিন এবং পুনঃব্যবহারযোগ্য কোড:
    PreparedStatement ব্যবহারে SQL কুয়েরি একবার কম্পাইল করা হয় এবং পরে শুধু প্যারামিটার পরিবর্তন করে একাধিক বার ব্যবহার করা যায়। এর ফলে কোডের পুনঃব্যবহারযোগ্যতা বাড়ে এবং কোড সহজ হয়।
  3. পারফরম্যান্স উন্নতি:
    PreparedStatement SQL কুয়েরি একবার কম্পাইল করার পরে, তা ডেটাবেসে ক্যাশে সেভ হয়ে থাকে। ফলে বারবার একই কুয়েরি চালানোর জন্য পুনরায় কম্পাইল করতে হয় না, যা পারফরম্যান্স বৃদ্ধি করে।
  4. ডেটাবেস নির্ভরতা:
    PreparedStatement ডেটাবেসের ভিন্নতার প্রতি আরো সহনশীল। SQL কুয়েরি একবার কম্পাইল হয়ে যাওয়ার কারণে, বিভিন্ন ডেটাবেসে এটি সহজে ব্যবহার করা যায়।

PreparedStatement কেন প্রয়োজনীয়?

  1. SQL ইনজেকশন থেকে রক্ষা:
    যখন আমরা ইউজার ইনপুট ডেটাবেসে সংযুক্ত করি, তখন এর মাধ্যমে SQL ইনজেকশন সমস্যা সৃষ্টি হতে পারে। PreparedStatement এই সমস্যা প্রতিরোধ করতে পারে, কারণ এটি ইউজার ইনপুটকে একটি ভ্যালু হিসেবে গ্রহণ করে, যা কখনোই SQL কোড হিসেবে এক্সিকিউট হয় না।
  2. ডাইনামিক প্যারামিটার ব্যবহার:
    যখন আমাদের কুয়েরির অংশ হিসেবে ডাইনামিক ডেটা (যেমন ইউজার ইনপুট বা অন্য কোনো ভেরিয়েবল) ব্যবহার করতে হয়, তখন PreparedStatement আমাদের SQL কুয়েরির ভিতরে এই প্যারামিটারগুলির জন্য প্লেসহোল্ডার (?) ব্যবহার করতে দেয় এবং পরে সহজেই মান যোগ করতে সাহায্য করে।
  3. পারফরম্যান্স ও স্কেলেবিলিটি:
    PreparedStatement ডেটাবেসে SQL কুয়েরি কম্পাইল ও ক্যাশ করে রাখে, ফলে যদি আমরা একাধিকবার একই কুয়েরি চালাই, তাহলে কম্পাইলিং সময়ের প্রয়োজন হয় না এবং পারফরম্যান্স উন্নতি হয়।
  4. এটি দ্রুত এবং বেশি নিরাপদ:
    PreparedStatement ব্যবহার করার ফলে অ্যাপ্লিকেশনটি SQL কুয়েরি এক্সিকিউশনের জন্য আরো দ্রুত এবং নিরাপদ হয়, যা প্রোডাকশন পরিবেশে গুরুত্বপূর্ণ।

Spring JDBC তে PreparedStatement ব্যবহার:

Spring JDBC এ JdbcTemplate ক্লাস ব্যবহার করা হয়, যা PreparedStatement এর সাথে ইন্টারঅ্যাক্ট করার জন্য একটি সিম্পল API প্রদান করে।

PreparedStatement উদাহরণ (Spring JDBC):

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import javax.sql.DataSource;

public class JdbcExample {
    private JdbcTemplate jdbcTemplate;

    public JdbcExample(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public void addUser(String name, String email) {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        
        jdbcTemplate.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(java.sql.PreparedStatement ps) throws java.sql.SQLException {
                ps.setString(1, name);   // First parameter
                ps.setString(2, email);  // Second parameter
            }
        });
    }
}

এখানে:

  • JdbcTemplate ব্যবহার করে আমরা PreparedStatement তৈরি করছি।
  • setValues() মেথডে PreparedStatement এর প্যারামিটারগুলো সেট করা হচ্ছে, যা SQL কুয়েরি এক্সিকিউট করার আগে ইনপুট মান হিসাবে পাস করা হয়।

সংক্ষেপে PreparedStatement এর সুবিধা:

  • SQL ইনজেকশন থেকে সুরক্ষা
  • কোডের পুনঃব্যবহারযোগ্যতা
  • পারফরম্যান্স বৃদ্ধি
  • ডেটাবেস নির্ভরতা
  • ডাইনামিক প্যারামিটার ব্যবহারের সহজতা

Spring JDBC এবং PreparedStatement একসাথে ব্যবহৃত হলে, ডেটাবেস অপারেশনগুলির জন্য নিরাপদ এবং দক্ষ কোড লেখা সম্ভব হয়।

Content added By

Spring JDBC তে PreparedStatementCreator এবং PreparedStatementSetter ব্যবহার করা

97
97

Spring JDBC ডেটাবেস অপারেশনের জন্য সুবিধাজনক টুলস সরবরাহ করে। PreparedStatementCreator এবং PreparedStatementSetter হলো দুটি ইন্টারফেস, যা জটিল SQL কুয়েরি বা ডাইনামিক প্যারামিটার সেট করার জন্য ব্যবহার করা হয়। এগুলো ডেটাবেস ইন্টিগ্রেশনে আরও বেশি কাস্টমাইজেশন এবং নিরাপত্তা নিশ্চিত করে।


১. PreparedStatementCreator

PreparedStatementCreator ইন্টারফেস ব্যবহার করে, আপনি কাস্টম PreparedStatement তৈরি করতে পারেন। এটি SQL কুয়েরি এবং তার প্যারামিটারগুলো ডাইনামিক্যালি সেট করার জন্য কার্যকর।

কোড স্ট্রাকচার

public interface PreparedStatementCreator {
    PreparedStatement createPreparedStatement(Connection con) throws SQLException;
}

ব্যবহার উদাহরণ

উপস্থিত ডেটাবেস কানেকশন দিয়ে একটি PreparedStatement তৈরি করুন।

public int insertUserWithPreparedStatementCreator(User user) {
    String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";

    return jdbcTemplate.update(con -> {
        PreparedStatement ps = con.prepareStatement(sql);
        ps.setInt(1, user.getId());
        ps.setString(2, user.getName());
        ps.setString(3, user.getEmail());
        return ps;
    });
}

এখানে:

  • con -> { ... } হলো PreparedStatementCreator এর একটি ল্যাম্বডা ইমপ্লিমেন্টেশন।
  • jdbcTemplate.update() মেথডের মাধ্যমে ডেটাবেসে ডেটা ইনসার্ট করা হচ্ছে।

২. PreparedStatementSetter

PreparedStatementSetter ইন্টারফেস ব্যবহার করে, একটি বিদ্যমান PreparedStatement-এর প্যারামিটার সেট করা যায়। এটি সাধারণত যেখানে একই SQL বারবার ব্যবহার করা হবে সেসব ক্ষেত্রে কার্যকর।

কোড স্ট্রাকচার

public interface PreparedStatementSetter {
    void setValues(PreparedStatement ps) throws SQLException;
}

ব্যবহার উদাহরণ

ডাইনামিক প্যারামিটার সেট করার জন্য PreparedStatementSetter ব্যবহার করুন।

public int updateUserWithPreparedStatementSetter(int id, String newEmail) {
    String sql = "UPDATE users SET email = ? WHERE id = ?";

    return jdbcTemplate.update(sql, new PreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps) throws SQLException {
            ps.setString(1, newEmail);
            ps.setInt(2, id);
        }
    });
}

এখানে:

  • PreparedStatementSetter ইন্টারফেস ইমপ্লিমেন্ট করে প্যারামিটার সেট করা হয়েছে।
  • jdbcTemplate.update() মেথড SQL অপারেশন পরিচালনা করছে।

PreparedStatementCreator এবং PreparedStatementSetter একসাথে ব্যবহার

কখনো কখনো PreparedStatementCreator এবং PreparedStatementSetter একত্রে ব্যবহার করতে হয়।

public int saveUser(User user) {
    String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";

    PreparedStatementCreator psc = con -> {
        PreparedStatement ps = con.prepareStatement(sql);
        return ps;
    };

    PreparedStatementSetter pss = ps -> {
        ps.setInt(1, user.getId());
        ps.setString(2, user.getName());
        ps.setString(3, user.getEmail());
    };

    return jdbcTemplate.update(psc, pss);
}

PreparedStatementCreator vs PreparedStatementSetter

ফিচারPreparedStatementCreatorPreparedStatementSetter
কাজসম্পূর্ণ নতুন PreparedStatement তৈরি করতে ব্যবহার হয়।বিদ্যমান PreparedStatement-এ প্যারামিটার সেট করতে ব্যবহার হয়।
ব্যবহারSQL কুয়েরি এবং প্যারামিটার ডাইনামিকভাবে তৈরি করা।সাধারণত বারবার ব্যবহারযোগ্য কুয়েরি অপটিমাইজেশনে।
প্রয়োগের পদ্ধতিল্যাম্বডা বা অ্যানোনিমাস ক্লাস।ল্যাম্বডা বা অ্যানোনিমাস ক্লাস।

উদাহরণ: PreparedStatementCreator এবং PreparedStatementSetter এর ব্যবহার

মাল্টিপল প্যারামিটার সহ ডেটা ইনসার্ট করা:

public void batchInsertUsers(List<User> users) {
    String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";

    jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            User user = users.get(i);
            ps.setInt(1, user.getId());
            ps.setString(2, user.getName());
            ps.setString(3, user.getEmail());
        }

        @Override
        public int getBatchSize() {
            return users.size();
        }
    });
}

উপকারিতা

  1. SQL ইনজেকশন প্রতিরোধ: PreparedStatement-এর কারণে ডেটা সুরক্ষিত থাকে।
  2. কোড রিইউজযোগ্যতা: কমপ্লেক্স লজিককে আলাদা করে মডুলার করা যায়।
  3. কাস্টমাইজেশন: স্পেসিফিক ডেটা ম্যানিপুলেশনের জন্য উপযোগী।

PreparedStatementCreator এবং PreparedStatementSetter Spring JDBC এর শক্তিশালী ফিচার, যা ডাটাবেস ইন্টিগ্রেশনে আরও বেশি নিয়ন্ত্রণ এবং নিরাপত্তা নিশ্চিত করে।

Content added By

Batch PreparedStatement এবং তার সুবিধা

66
66

NamedParameterJdbcTemplate স্প্রিং জেডিবিসি (Spring JDBC) এর একটি গুরুত্বপূর্ণ ক্লাস, যা SQL কুয়েরিতে নামকৃত প্যারামিটার ব্যবহার করার সুবিধা প্রদান করে। এটি সাধারণ JdbcTemplate এর উন্নত সংস্করণ, যেখানে প্যারামিটারাইজড কুয়েরি তৈরির সময় নামকৃত প্যারামিটার (Named Parameters) ব্যবহার করা যায়, যা কোডকে আরও পাঠযোগ্য, সহজ এবং ভুলমুক্ত করে তোলে।

NamedParameterJdbcTemplate কি?

NamedParameterJdbcTemplate একটি ক্লাস যা স্প্রিং জেডিবিসি ফ্রেমওয়ার্কের অংশ। এটি JdbcTemplate এর মত কাজ করে, তবে এটি SQL কুয়েরি এক্সিকিউট করার সময় প্যারামিটারাইজড কুয়েরিতে নামকৃত প্যারামিটার ব্যবহার করার সুযোগ দেয়। এর মাধ্যমে SQL কুয়েরি লেখার সময় প্যারামিটারগুলি নাম দ্বারা চিহ্নিত করা হয়, যেমন :param1, :param2, ইত্যাদি।

NamedParameterJdbcTemplate এর সুবিধাসমূহ:

  1. পাঠযোগ্য কোড: নামকৃত প্যারামিটার ব্যবহার করার মাধ্যমে কোডটি আরও পরিষ্কার এবং পাঠযোগ্য হয়। সাধারণত, প্যারামিটার মানগুলি ? চিহ্ন দ্বারা স্থাপন করা হয়, কিন্তু নামকৃত প্যারামিটার ব্যবহার করলে প্রতিটি প্যারামিটার কী কাজ করছে তা সহজে বোঝা যায়।
  2. ভুল হওয়া কম: যখন অনেক প্যারামিটার থাকে, তখন ? প্যারামিটারগুলো সঠিকভাবে ব্যবহার করা কঠিন হতে পারে। নামকৃত প্যারামিটার ব্যবহার করলে প্যারামিটারগুলোর অবস্থান ও অর্থ স্পষ্ট হয়ে ওঠে, ফলে ভুল হওয়ার সম্ভাবনা কমে।
  3. উন্নত প্যারামিটারাইজড কুয়েরি: যদি SQL কুয়েরিতে অনেক প্যারামিটার থাকে এবং তাদের অবস্থান নির্দিষ্টভাবে জানানো প্রয়োজন হয়, তাহলে নামকৃত প্যারামিটার সহজ এবং দক্ষ উপায় হিসেবে কাজ করে।
  4. ডাইনামিক কুয়েরি নির্মাণ: এটি ডাইনামিক SQL কুয়েরি তৈরি করতে সহায়তা করে, যেখানে প্যারামিটারগুলোর মান ডাইনামিকভাবে নির্ধারণ করা হয় এবং কুয়েরি চালানো হয়।

NamedParameterJdbcTemplate ব্যবহার করার উদাহরণ:

ধরা যাক, আমাদের একটি Employee টেবিল থেকে কিছু ডেটা পড়তে হবে যেখানে id এবং name প্যারামিটার হিসেবে ব্যবহার করা হবে।

১. কনফিগারেশন:

প্রথমে, NamedParameterJdbcTemplate এবং ডেটাবেস সংযোগ সেটআপ করা প্রয়োজন।

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

public class DataSourceConfig {

    public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
        DataSource dataSource = dataSource();
        return new NamedParameterJdbcTemplate(dataSource);
    }

    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        return dataSource;
    }
}

২. NamedParameterJdbcTemplate এর ব্যবহার:

এখন, NamedParameterJdbcTemplate ব্যবহার করে SQL কুয়েরি এক্সিকিউট করা হবে।

import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import java.util.List;
import java.util.Map;

public class EmployeeDao {

    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
    }

    public List<Employee> getEmployeesByIdAndName(int id, String name) {
        String sql = "SELECT * FROM Employee WHERE id = :id AND name = :name";
        
        MapSqlParameterSource parameters = new MapSqlParameterSource();
        parameters.addValue("id", id);
        parameters.addValue("name", name);

        return namedParameterJdbcTemplate.query(sql, parameters, new EmployeeRowMapper());
    }
}

৩. RowMapper:

এখানে EmployeeRowMapper হল একটি কাস্টম ক্লাস যা RowMapper ইন্টারফেস ইমপ্লিমেন্ট করে, যেটি SQL কুয়েরি থেকে প্রাপ্ত রেকর্ডকে Employee অবজেক্টে ম্যাপ করবে।

import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;

public class EmployeeRowMapper implements RowMapper<Employee> {

    @Override
    public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
        Employee employee = new Employee();
        employee.setId(rs.getInt("id"));
        employee.setName(rs.getString("name"));
        // আরও প্রপার্টি সেট করুন
        return employee;
    }
}

কেন NamedParameterJdbcTemplate ব্যবহার করা হয়?

  1. নামকৃত প্যারামিটার: SQL কুয়েরি লেখার সময় ? ব্যবহার না করে নামকৃত প্যারামিটার যেমন :id, :name ব্যবহার করতে পারা যায়, যা কোডের পাঠযোগ্যতা বাড়ায়।
  2. নির্ভুল প্যারামিটার মান: যখন SQL কুয়েরিতে অনেক প্যারামিটার থাকে, তখন নামকৃত প্যারামিটার ব্যবহার করে তাদের অবস্থান ভুল হওয়ার সম্ভাবনা কমে।
  3. ডাইনামিক কুয়েরি: এটি ডাইনামিক SQL কুয়েরি তৈরিতে সহায়ক, যেখানে প্যারামিটারগুলোর মান কনফিগারেবল হয় এবং নির্দিষ্ট কুয়েরি তৈরি করা হয়।

সারাংশ:

NamedParameterJdbcTemplate স্প্রিং জেডিবিসির একটি শক্তিশালী ক্লাস যা SQL কুয়েরিতে নামকৃত প্যারামিটার ব্যবহারের সুবিধা প্রদান করে। এটি কোডের পাঠযোগ্যতা এবং ডাইনামিক SQL কুয়েরি নির্মাণে সহায়ক। যখন SQL কুয়েরিতে অনেক প্যারামিটার থাকে, তখন এটি ব্যবহারের মাধ্যমে কোড সহজ এবং ভুলমুক্ত করা যায়।

Content added By

উদাহরণ সহ PreparedStatement এর ব্যবহার

70
70

NamedParameterJdbcTemplate হলো JdbcTemplate এর একটি সম্প্রসারণ, যা SQL কুয়েরিতে নামযুক্ত প্যারামিটার (Named Parameters) ব্যবহার করার সুবিধা প্রদান করে। সাধারণ JdbcTemplate এর মাধ্যমে SQL কুয়েরি লেখা হয় যেখানে প্যারামিটারগুলো পজিশনাল (Positional Parameters) হিসেবে প্রদান করা হয় (যেমন ? ব্যবহার করা হয়)। কিন্তু NamedParameterJdbcTemplate এর মাধ্যমে SQL কুয়েরিতে প্যারামিটারগুলো নাম দিয়ে উল্লেখ করা হয়, যেমন :paramName

এই পদ্ধতিটি SQL কুয়েরি আরো পরিষ্কার, রিডেবল এবং নিরাপদ করে তোলে। বিশেষ করে যখন অনেক প্যারামিটার থাকে, তখন নামযুক্ত প্যারামিটার ব্যবহার করা কোডের মান এবং রক্ষণাবেক্ষণ সহজ করে।

NamedParameterJdbcTemplate এর সুবিধা:

  1. নামযুক্ত প্যারামিটার: কোডের মধ্যে প্যারামিটার ব্যবহারের সময় স্পষ্টতা বজায় থাকে। SQL কুয়েরিতে প্যারামিটারগুলো সরাসরি নামের মাধ্যমে উল্লেখ করা হয়, যেমন :id, :name ইত্যাদি।
  2. ক্লিনার কোড: পজিশনাল প্যারামিটার ব্যবহার করার থেকে নামযুক্ত প্যারামিটার ব্যবহার করা সহজ এবং আরও পরিষ্কার।
  3. নিরাপত্তা: নামযুক্ত প্যারামিটার SQL ইনজেকশন থেকে সুরক্ষা প্রদান করে, কারণ এটি SQL কুয়েরির মধ্যে ডেটা প্রবাহকে আরও সঠিকভাবে নিয়ন্ত্রণ করে।

NamedParameterJdbcTemplate ব্যবহারের উদাহরণ:

১. কনফিগারেশন এবং DataSource সেটআপ:

import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;

public class DataSourceConfig {
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        return dataSource;
    }
}

২. NamedParameterJdbcTemplate ব্যবহার করে ডেটাবেস অপারেশন:

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

public class EmployeeDao {
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    // DataSource Inject করা হচ্ছে
    public void setDataSource(DataSource dataSource) {
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    // ইনসার্ট অপারেশন: নামযুক্ত প্যারামিটার ব্যবহার
    public void insertEmployee(Employee employee) {
        String sql = "INSERT INTO employee (id, name, age) VALUES (:id, :name, :age)";
        
        Map<String, Object> params = new HashMap<>();
        params.put("id", employee.getId());
        params.put("name", employee.getName());
        params.put("age", employee.getAge());

        namedParameterJdbcTemplate.update(sql, params);
    }

    // ডেটাবেস থেকে এক্সিকিউট করা কুয়েরি: নামযুক্ত প্যারামিটার ব্যবহার
    public Employee getEmployeeById(int id) {
        String sql = "SELECT * FROM employee WHERE id = :id";
        
        Map<String, Object> params = new HashMap<>();
        params.put("id", id);

        return namedParameterJdbcTemplate.queryForObject(sql, params, new EmployeeRowMapper());
    }
}

কীভাবে কাজ করে:

  1. SQL কুয়েরি: SQL কুয়েরিতে নামযুক্ত প্যারামিটার ব্যবহার করা হয়েছে, যেমন :id, :name, :age
  2. Map<String, Object>: একটি Map তৈরি করা হয়েছে, যেখানে SQL প্যারামিটারগুলির নাম (যেমন id, name, age) কীগুলি এবং তাদের মান মানগুলি হিসেবে স্টোর করা হয়েছে।
  3. MapSqlParameterSource (অপশনাল): Map<String, Object> এর পরিবর্তে MapSqlParameterSource ব্যবহার করেও নামযুক্ত প্যারামিটার পাস করা যায়, যা আরো সুবিধাজনক এবং স্পষ্ট।

MapSqlParameterSource ব্যবহার উদাহরণ:

import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;

public void insertEmployee(Employee employee) {
    String sql = "INSERT INTO employee (id, name, age) VALUES (:id, :name, :age)";

    MapSqlParameterSource params = new MapSqlParameterSource();
    params.addValue("id", employee.getId());
    params.addValue("name", employee.getName());
    params.addValue("age", employee.getAge());

    namedParameterJdbcTemplate.update(sql, params);
}

এখানে MapSqlParameterSource ব্যবহার করা হয়েছে যা Map<String, Object> এর থেকে আরও ক্লিন এবং সুবিধাজনক।

প্রধান উপকারিতা:

  • রিডেবিলিটি: নামযুক্ত প্যারামিটার কোডের রিডেবিলিটি বাড়ায়, কারণ প্যারামিটারগুলি SQL কুয়েরির মধ্যে স্পষ্টভাবে উল্লেখ করা হয়।
  • কমপ্লেক্স কুয়েরি ম্যানেজমেন্ট: একাধিক প্যারামিটার এবং জটিল কুয়েরি ব্যবস্থাপনা সহজ হয়।
  • ফলস/নাল সুরক্ষা: নামযুক্ত প্যারামিটারগুলি নাল (null) ভ্যালু সমর্থন করে এবং SQL ইনজেকশনের বিরুদ্ধে আরও সুরক্ষা প্রদান করে।

উপসংহার:

স্প্রিং জেডিবিসি এর NamedParameterJdbcTemplate নামযুক্ত প্যারামিটার ব্যবহারের মাধ্যমে ডেটাবেস অপারেশন আরও সহজ, পরিষ্কার এবং নিরাপদ করে তোলে। এটি কোডের রিডেবিলিটি এবং রক্ষণাবেক্ষণ সহজ করে এবং বিশেষত জটিল কুয়েরি ও প্যারামিটার ব্যবস্থাপনার ক্ষেত্রে খুবই কার্যকর।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion